ποΈGitΠ―ΡΠ°ποΈ
docs/roadmap.md d4eadee500c39e2e09f352a385ee7f3b2bd1a79f (d4eadee5) Text, 9.10 KB
Tc9d1d9# Roadmap
Tff7b72> Last updated: 2026-04-15
Forward-looking priorities for the Meshtastic KMP multi-target effort. For current state, see [Ta5d6ff`kmp-status.md`](./kmp-status.md).
Tc9d1d9## Architecture Health (Immediate)
These items address structural gaps identified in the March 2026 architecture review. They are prerequisites for safe multi-target expansion.
| Item | Impact | Effort | Status |
|---|---|---|---|
| Purge Ta5d6ff`java.util.Locale` from Ta5d6ff`commonMain` (3 files) | High | Low | β
|
| Replace Ta5d6ff`ConcurrentHashMap` in Ta5d6ff`commonMain` (3 files) | High | Low | β
|
| Create Ta5d6ff`core:testing` shared test fixtures | Medium | Low | β
|
| Add feature module Ta5d6ff`commonTest` (settings, node, messaging) | Medium | Medium | β
|
| Desktop Koin Ta5d6ff`checkModules()` integration test | Medium | Low | β
|
| Auto-wire Desktop ViewModels via K2 Compiler (eliminate manual wiring) | Medium | Low | β
|
| **Migrate to JetBrains Compose Multiplatform dependencies** | High | Low | β
|
| **iOS CI gate (compile-only validation)** | High | Medium | β
|
| **Commonize utilities** (Ta5d6ff`formatString`, Ta5d6ff`SfppHasher`, Ta5d6ff`CryptoCodec`, Ta5d6ff`CommonUri`) | High | Medium | β
|
| **Centralize metric formatting** (Ta5d6ff`MetricFormatter`) | Medium | Low | β
|
Tc9d1d9## Active Work
Tc9d1d9### Desktop Feature Completion (Phase 4)
**Objective:** Complete desktop wiring for all features and ensure full integration.
**Current State (March 2026):**
Tff7b72- β
**Settings:** ~35 screens with real configuration, including theme/about parity and desktop language picker support
Tff7b72- β
**Nodes:** Adaptive list-detail with node management
Tff7b72- β
**Messaging:** Adaptive contacts with message view + send
Tff7b72- β
**Connections:** Dynamic discovery of platform-supported transports (TCP, Serial/USB, BLE)
Tff7b72- β **Map:** Placeholder only, needs MapLibre or alternative
Tff7b72- β οΈ **Firmware:** Fully KMP (Unified OTA + native Secure DFU + USB/UF2); desktop is first-class target
Tff7b72- β οΈ **Intro:** Onboarding flow (may not apply to desktop)
**Implementation Steps:**
Tff7b721. **Tier 1: Core Wiring (Essential)**
Tff7b72- Complete Map integration (MapLibre or equivalent)
Tff7b72- Verify all features accessible via navigation
Tff7b72- Test navigation flows end-to-end
Tff7b722. **Tier 2: Polish (High Priority)**
Tff7b72- Additional desktop-specific settings polish
Tff7b72- β
**Keyboard shortcuts** via Ta5d6ff`onPreviewKeyEvent` (MenuBar removed)
Tff7b72- **Adaptive density & multitasking optimizations** (2026 Desktop Guidelines)
Tff7b72- Window management
Tff7b72- State persistence
Tff7b723. **Tier 3: Advanced (Nice-to-have)**
Tff7b72- Performance optimization
Tff7b72- Advanced map features
Tff7b72- Theme customization
Tff7b72- Multi-window support
| Transport | Platform | Status |
|---|---|---|
| TCP | Desktop (JVM) | β
Done β shared Ta5d6ff`StreamFrameCodec` + Ta5d6ff`TcpTransport` in Ta5d6ff`core:network` |
| Serial/USB | Desktop (JVM) | β
Done β jSerialComm |
| MQTT | All (KMP) | β
Completed β KMQTT in commonMain |
| BLE | All (KMP) | β
Done β Kable in Ta5d6ff`commonMain` (Ta5d6ff`BleRadioTransport`) |
Tc9d1d9### Desktop Feature Gaps
| Feature | Status |
|---|---|
| Settings | β
~35 real screens (fully shared); Ta5d6ff`DeviceConfig`, Ta5d6ff`PositionConfig`, Ta5d6ff`SecurityConfig`, Ta5d6ff`ExternalNotificationConfig` fully unified into Ta5d6ff`commonMain` |
| Node list | β
Adaptive list-detail with real Ta5d6ff`NodeDetailContent` |
| Messaging | β
Adaptive contacts with real message view + send |
| Connections | β
Unified shared UI with dynamic transport detection |
| Metrics logs | β
TracerouteLog, NeighborInfoLog, HostMetricsLog |
| Map | β Needs MapLibre or equivalent |
| QR Generation | β
Pure KMP generation via Ta5d6ff`qrcode-kotlin` |
| Charts | β
Vico KMP charts wired in commonMain (Device, Environment, Signal, Power, Pax) |
| Debug Panel | β
Real screen (mesh log viewer via shared Ta5d6ff`DebugViewModel`) |
| Notifications | β
Desktop native notifications with system tray icon support |
| MenuBar | β
Removed β replaced with Ta5d6ff`onPreviewKeyEvent` keyboard shortcuts (βQ, β,, ββ§T, β1-4, β/) |
| About | β
Shared Ta5d6ff`commonMain` screen (AboutLibraries KMP Ta5d6ff`produceLibraries` + per-platform JSON) |
| Packaging | β
Done β Native distribution pipeline in CI (DMG, MSI, DEB) |
Tc9d1d9## Near-Term Priorities (30 days)
Tff7b721. **Evaluate KMP-native testing tools** β β
**Done:** Fully evaluated and integrated Ta5d6ff`Mokkery`, Ta5d6ff`Turbine`, and Ta5d6ff`Kotest` across the KMP modules. Ta5d6ff`mockk` has been successfully replaced, enabling property-based and Flow testing in Ta5d6ff`commonTest` for iOS readiness.
Tff7b722. **Desktop Map Integration** β Address the major Desktop feature gap by implementing a raster map view using [**MapComposeMP**](https://github.com/p-lr/MapComposeMP).
Tff7b72- Implement Desktop providers for the 3 decomposed map contracts: Ta5d6ff`MapViewProvider` (main map), Ta5d6ff`NodeTrackMapProvider` (per-node track overlay for Ta5d6ff`PositionLogScreen`), and Ta5d6ff`TracerouteMapProvider` (traceroute visualization).
Tff7b72- Implement a **Web Mercator Projection** helper in Ta5d6ff`feature:map/commonMain` to translate GPS coordinates to the 2D image plane.
Tff7b72- Leverage the existing Ta5d6ff`BaseMapViewModel` contract and Ta5d6ff`TracerouteNodeSelection` logic in Ta5d6ff`commonMain`.
Tff7b723. **Unify `MapViewModel`** β Collapse the remaining Google and F-Droid specific Ta5d6ff`MapViewModel` classes in the Ta5d6ff`:app` module into a single Ta5d6ff`commonMain` implementation by isolating platform-specific settings (styles, tile sources) behind a repository interface. The Ta5d6ff`MapViewProvider` interface has been simplified (track/traceroute rendering extracted to dedicated providers), reducing the surface area of this unification.
Tff7b724. **iOS CI gate** β β
**Done:** added Ta5d6ff`iosArm64()`/Ta5d6ff`iosSimulatorArm64()` to convention plugins and CI. Ta5d6ff`commonMain` successfully compiles on iOS.
Tc9d1d9## Medium-Term Priorities (60 days)
Tff7b721. **iOS proof target** β β
**Done (Stubbing):** Stubbed iOS target implementations (Ta5d6ff`NoopStubs.kt` equivalent) to successfully pass compile-time checks. **Next:** Setup an Xcode skeleton project and launch the iOS app.
Tff7b722. **Migrate to Navigation 3 Scene-based architecture** β leverage the first stable release of Nav 3 to support multi-pane layouts. **Investigate 3-pane "Power User" scenes** (e.g., Node List + Detail + Map/Charts) on Large (1200dp) and Extra-large (1600dp) displays (Android 16 QPR3).
Tff7b723. **`core:api` contract split** β separate transport-neutral service contracts from the Android AIDL packaging to support iOS/Desktop service layers.
Tc9d1d9## Longer-Term (90+ days)
Tff7b721. **Platform-Native UI Interop** β
Tff7b72- **iOS Maps & Camera:** Implement Ta5d6ff`MapLibre` or Ta5d6ff`MKMapView` via Compose Multiplatform's Ta5d6ff`UIKitView`. Leverage Ta5d6ff`AVCaptureSession` wrapped in Ta5d6ff`UIKitView` to fulfill the Ta5d6ff`LocalBarcodeScannerProvider` contract.
Tff7b72- **Web (wasmJs) Integrations:** Leverage Ta5d6ff`HtmlView` to embed raw DOM elements (e.g., Ta5d6ff`<video>`, Ta5d6ff`<iframe>`, or canvas-based maps) directly into the Compose UI tree while binding the root app via Ta5d6ff`CanvasBasedWindow`.
Tff7b722. **Module maturity dashboard** β living inventory of per-module KMP readiness.
Tff7b723. **Shared UI vs Shared Logic split** β If the iOS target utilizes native SwiftUI instead of Compose Multiplatform, evaluate splitting feature modules into pure Ta5d6ff`sharedLogic` (business rules, ViewModels) and Ta5d6ff`sharedUI` (Compose Multiplatform) to prevent dragging Compose dependencies into pure native iOS apps.
Tc9d1d9## Design Principles
Tff7b721. **Solve in `commonMain` first.** If it doesn't need platform APIs, it belongs in Ta5d6ff`commonMain`.
Tff7b722. **Interfaces in `commonMain`, implementations per-target.** The repository pattern is established β extend it. Prefer dependency injection (Koin) with interfaces over Ta5d6ff`expect`/Ta5d6ff`actual` declarations whenever possible to keep architecture decoupled and highly testable.
Tff7b723. **UI Interop Strategies.** When a Compose Multiplatform equivalent doesn't exist (e.g., Maps, Camera), use standard interop APIs rather than extracting the entire screen to native code. Use Ta5d6ff`AndroidView` for Android, Ta5d6ff`UIKitView` for iOS, Ta5d6ff`SwingPanel` for JVM/Desktop, and Ta5d6ff`HtmlView` for Web (Ta5d6ff`wasmJs`). Always wrap these in a shared Ta5d6ff`commonMain` interface contract (like Ta5d6ff`LocalBarcodeScannerProvider`).
Tff7b724. **Stubs are a valid first implementation.** Every target starts with no-op stubs, then graduates to real implementations.
Tff7b725. **Feature modules stay target-agnostic in `commonMain`.** Platform UI goes in platform source sets. Keep the UI layer dumb and rely on shared ViewModels (Unidirectional Data Flow) to drive state.
Tff7b726. **Transport is a pluggable adapter.** BLE, serial, TCP, MQTT all implement Ta5d6ff`RadioTransport` and are orchestrated by a shared Ta5d6ff`RadioInterfaceService`.
Tff7b727. **CI validates every target.** If a module declares Ta5d6ff`jvm()`, CI compiles it. No exceptions. Run tests on appropriate host runners (macOS for iOS, Linux for JVM/Android) to catch platform regressions.
Tff7b728. **Test in `commonTest` first.** ViewModel and business logic tests belong in Ta5d6ff`commonTest` so every target runs them. Use shared Ta5d6ff`core:testing` utilities to minimize duplication.
Tff7b729. **Zero Platform Leaks.** Never import Ta5d6ff`java.*` or Ta5d6ff`android.*` inside Ta5d6ff`commonMain`. Use KMP-native alternatives like Ta5d6ff`kotlinx-datetime` and Ta5d6ff`Okio`.
Served by rngit 1.5.2 - Generated in 0.18s